SAVOR: Part IV

ggplot2

Author

Robin Genuer & Boris Hejblum

Published

June 11, 2025

Introduction

Ce document donne quelques éléments introductifs sur l’utilisation du package ggplot2.

Le package ggplot2

ggplot2 est un package de plus en plus utilisé pour tracer des graphiques sur R. La syntaxe est différente des fonctions graphiques de base, mais s’avère très puissante en pratique. Une très bonne référence pour commencer à utiliser ce package se trouve ici. L’aide en ligne est plus complète (mais très fournie). On pourra également se reporter à cet aide-mémoire

Installer le package puis le charger.

Importer ensuite le jeu de données naissance.txt documentant le poids à la naissance de 189 nouveaux-nés en fonctions d’un certains nombres de variable (dont l’âge de la mère, son poids ainsi que l’historique d’hypertension), puis transformer la variable SMOKE pour illustrer le codage “Non-Fumeur” (codé 0) et “Fumeur” (codé 1), ainsi que la variable HT codée “Non” (0) et “Oui” (1).

## 'data.frame':    189 obs. of  10 variables:
##  $ ID   : int  85 86 87 88 89 91 92 93 94 95 ...
##  $ AGE  : int  19 33 20 21 18 21 22 17 29 26 ...
##  $ LWT  : int  182 155 105 108 107 124 118 103 123 113 ...
##  $ RACE : int  2 3 1 1 1 3 1 3 1 1 ...
##  $ SMOKE: Factor w/ 2 levels "Non-Fumeur","Fumeur": 1 1 2 2 2 1 1 1 2 2 ...
##  $ PTL  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HT   : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
##  $ UI   : int  1 0 0 1 1 0 0 0 0 0 ...
##  $ FVT  : int  0 3 1 2 0 0 1 1 1 0 ...
##  $ BWT  : int  2523 2551 2557 2594 2600 2622 2637 2637 2663 2665 ...

La fonction ggplot()

ggplot2 fonctionne par un système de couches (“layers”). Ce système permet de rajouter des couches avec +.

La fonction principale du package ggplot2 est la fonction ggplot(). À cette fonction, qui a pour but de spécifier et de préparer les données pour le graphique, on ajoute donc des couches grâce aux fonctions geom_...(), qui vont spécifier le type de graphique à afficher (par exemple geom_point() ou geom_bar()).

De plus, ggplot2 permet de rajouter des couches à des graphiques déjà existants sauvegardés dans des objets. C’est un comportement très différent de la gestion des graphiques comparé au R de base.

Nuage de points

Exercice 1 :

  1. Tracer le nuage de point du poids à la naissance (variable BWT) en fonction de l’âge (variable AGE) grâce à la fonction geom_point().

  2. Ajouter une couleur selon le statut tabagique de la mère (SMOKE) (on remarque que la légende se trace automatiquement).

  3. Rajouter une droite de régression avec la fonction geom_smooth().

  4. Consulter l’aide de la fonction geom_smooth() pour enlever l’intervalle de confiance et tracer la droite en rouge.

  5. A l’aide de geom_hline(), ajouter une droite horizontale d’ordonnée 2500, bleue et de style “tirets”.

  6. Créer un objet p qui contient le graphique du nuage de points uniquement comme demandé à la question 1 (taper le nom de l’objet pour vérifier que le graphique a été correctement créé.). Rajouter ensuite la droite de régression en modifiant p.

  7. Préciser le nom des axes.

  8. Ajouter le thème theme_bw() afin de se rapprocher d’un style plus classique de graphique.

Stratification

Le package ggplot2 rend très facile la stratification des représentations selon des groupes définis par une variable catégorielle.

Exercice 2 :

  1. Reproduire le graphique précédent en traçant 2 droites de regression selon le statut tabagique de la mère (en introduisant l’estéthique groupdans la fonction aes() de la fonction geom_smooth()).

  1. Utiliser la fonction facet_wrap() pour tracer 2 graphiques distincts.

  2. Laisser l’échelle s’adapter à chacun des 2 graphiques.

Autres types de graphiques

Exercice 3 :

  1. Tracer un boxplot du poids du bébé à la naissance (on utilisera x="" dans les esthétiques de geom_boxplot()).

  1. Stratifier selon le statut fumeur de la mère (on pourra s’intéresser à l’esthétique fill).

  2. Ajouter un titre avec la fonction ggtitle().

  1. Tracer un histogramme du poids à la naissance avec la fonction geom_histogram(). Ajouter un contour blanc pour une meilleure lisibilité. Ajouter une ligne verticale indiquant la limite inférieure de 2,5 kg.

  1. Remplir les barres de l’histogramme selon l’historique d’hypertension.

  2. Changer le code couleur grâce à la fonction scale_fill_manual().

  1. Tracer une estimation de la densité de probabilité du poids à la naissance, dans chaque groupe de statut tabagique (sur le même graphique) avec la fonction geom_density().

  1. Passer à l’échelle logarithmique avec la fonction scale_x_log10().

  2. Exporter le graphique au fromat .png avec la fonction ggsave(), avec une résolution de 300 dpi, puis au format .eps.

  3. Ajouter une ligne verticale indiquant la limite inférieure de 2,5 kg, puis ajouter une légende pour la ligne verticale.

Exercice 4: patchwork

Le package patchwork permet de simplement accoler plusieurs ggplots pour former une seule figure.

  1. Afficher les graphiques obtenus aux questions Ex 2.1, Ex 4.6 et Ex 4.10 sur un même graphique (n’hésitez pas à vous référer à l’aide Get Started de patchwork)

  2. Agencer les légende via la fonction plot_layout() (n’hésitez pas à vous référer à la section Controlling guides de l’aide sur les layout. Vous pouvez utilisez &au lieu de plus + afin d’appliquer un élément (comme un theme() par exemple) à tous les plots du patchwork.

  3. À l’aide de la fonction guides() supprimer les légendes superflues (e.g. en utilisant guides(fill="none"))).

  4. Ajouter une lettre pour identifier chaque graphique de votre figure finale grâce à la fonction plot_annotation().

NB: D’autres packages comme cowplot ou ggpubr servent le même objectifs mais avec une syntaxe plus complexe.

Exercice 5: gganimate

Objectif

Transformer des graphiques statiques en graphiques dynamiques avec le package gganimate

Pré-requis

Installation des packages nécessaires

Code
if (!require("gapminder", quietly = TRUE))
    install.packages("gapminder")
if (!require("ggplot2", quietly = TRUE))
    install.packages("ggplot2")
if (!require("gganimate", quietly = TRUE))
    install.packages("gganimate")
if (!require("gifski", quietly = TRUE))
    install.packages("gifski")
if (!require("transformr", quietly = TRUE))
    install.packages("transformr")
if (!require("MetBrewer", quietly = TRUE))
    install.packages("MetBrewer")
if (!require("ggrepel", quietly = TRUE))
    install.packages("ggrepel")
if (!require("dplyr", quietly = TRUE))
    install.packages("dplyr")

La documentation de gganimate est accessible ici 👉🌐

Jeu de données

Nous allons utiliser le jeu de données gapminder tout au long de ce tutoriel

##         country        continent        year         lifeExp     
##  Afghanistan:  12   Africa  :624   Min.   :1952   Min.   :23.60  
##  Albania    :  12   Americas:300   1st Qu.:1966   1st Qu.:48.20  
##  Algeria    :  12   Asia    :396   Median :1980   Median :60.71  
##  Angola     :  12   Europe  :360   Mean   :1980   Mean   :59.47  
##  Argentina  :  12   Oceania : 24   3rd Qu.:1993   3rd Qu.:70.85  
##  Australia  :  12                  Max.   :2007   Max.   :82.60  
##  (Other)    :1632                                                
##       pop              gdpPercap       
##  Min.   :6.001e+04   Min.   :   241.2  
##  1st Qu.:2.794e+06   1st Qu.:  1202.1  
##  Median :7.024e+06   Median :  3531.8  
##  Mean   :2.960e+07   Mean   :  7215.3  
##  3rd Qu.:1.959e+07   3rd Qu.:  9325.5  
##  Max.   :1.319e+09   Max.   :113523.1  
## 

Le “problème” avec les graphiques statiques

👉 TODO n°1 : à l’aide de ggplot2, représenter l’espérance de vie selon le PIB.

👉 TODO n°2 : à l’aide de la fonction scale_size(), transformer le graphique précédent pour tenir comptede la population totale d’une année spécifique (par exemple 2007).
Bonus: ajouter une 4^ème^ dimension en colorant le graphique par continent.

👉 TODO n°3 : faire un graphique pour visualiser l’espérance de vie en fonction du PIB annuel pour chaque pays.

Première approche pour des graphiques intéractifs : transition_time()

Nous allons maintenant utiliser un outil dynamique afin d’éviter d’avoir à générer 55 graphiques ou d’attribuer une couleur différente pour chacune des 55 années.

👉 TODO n°4 : suivre l’exemple ci-dessous qui s’appuie sur gganimate pour générer un graphique animé en .gif.

Code
# necessary libraries
library(gganimate)
library(gifski)

p <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific geom_point(alpha
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific =
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific 0.7)
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific +
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific scale_x_log10()
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific +
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific theme_minimal()
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific +
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific #
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific gganimate
    geom_point(alpha = 0.7) + scale_x_log10() + theme_minimal() + # gganimate specific specific
labs(title = "Year: {frame_time}", x = "GDP per capita", y = "Espérance de vie") +
    scale_size(name = "Population", breaks = c(10^7, 5 * 10^7, 10^8, 5 * 10^8, 10^9,
        5 * 10^9), range = c(1, 15)) + scale_color_manual("Continent", values = MetBrewer::met.brewer("Cross",
    n = 5, type = "d")) + transition_time(year) + ease_aes("linear")
p

Code
animate(p, duration = 5, fps = 20, width = 500, height = 500, renderer = gifski_renderer())

# Save as a .gif
anim_save("../Results/gganimate1.gif")

⚠️ Les graphiques dynamiques ne sont pas seulement réservés aux variations temporelles : ici on peut, par exemple, ajouter chaque continent l’un après l’autre sur le graphique.
👉 À vous !

Gaphique animés avancés : plus de transitions

transition_layers()

👉 TODO n°5 : avec ggplot2, créer un boxplot de l’espérance de vie par continent

👉 TODO n°5 bis : rendre ce graphique dynamique (démarrer de la médiane et créer une expansion similaire à ce que l’on trouve dans powerpoint)

transition_reveal()

👉 TODO n°6 : avec ggplot2, tracer l’évolution de l’espérance de vie au cours du temps, par continent.

👉 TODO n°6 bis : recommencer, mais avec un graphique animé cette fois.

transition_states() & shadow_mark()

👉 TODO n°7: représenter la densité de l’espérance de vie mondiale pr année

👉 TODO n°7 bis : animer le !

👉 BONUS: Dessine moi un dinosaure (jeter un oeil au package datasauRus) !